// CHECKSTYLE_OFF: Copyrighted to ASF
/*
 * Copyright 1999-2004 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
// CHECKSTYLE_ON
package com.google.j2cl.jre.java.util;

import java.util.Iterator;
import java.util.NoSuchElementException;

/** Base class for testing Iterator interface */
@SuppressWarnings("rawtypes")
abstract class TestIterator extends TestObject {

  public abstract Iterator makeEmptyIterator();

  public abstract Iterator makeFullIterator();

  /**
   * Whether or not we are testing an iterator that can be empty. Default is true.
   *
   * @return true if Iterators can be empty
   */
  public boolean supportsEmptyIterator() {
    return true;
  }

  /**
   * Whether or not we are testing an iterator that can contain elements. Default is true.
   *
   * @return true if Iterators can be empty
   */
  public boolean supportsFullIterator() {
    return true;
  }

  /**
   * Whether or not we are testing an iterator that supports remove. Default is true.
   *
   * @return true if Iterators can remove elements
   */
  public boolean supportsRemove() {
    return true;
  }

  /** Should throw a NoSuchElementException. */
  public void testEmptyIterator() {
    if (!supportsEmptyIterator()) {
      return;
    }

    Iterator iter = makeEmptyIterator();
    assertTrue("hasNext() should return false for empty iterators", !iter.hasNext());
    try {
      iter.next();
      fail("NoSuchElementException must be thrown when Iterator is exhausted");
    } catch (NoSuchElementException e) {
    }
  }

  /**
   * NoSuchElementException (or any other exception) should not be thrown for the first element.
   * NoSuchElementException must be thrown when hasNext() returns false
   */
  public void testFullIterator() {
    if (!supportsFullIterator()) {
      return;
    }

    Iterator iter = makeFullIterator();

    assertTrue("hasNext() should return true for at least one element", iter.hasNext());

    try {
      iter.next();
    } catch (NoSuchElementException e) {
      fail("Full iterators must have at least one element");
    }

    while (iter.hasNext()) {
      iter.next();
    }

    try {
      iter.next();
      fail("NoSuchElementException must be thrown when Iterator is exhausted");
    } catch (NoSuchElementException e) {
    }
  }
}
